kexec: Add machine_kexec_get()
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 28 Feb 2008 10:46:27 +0000 (10:46 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 28 Feb 2008 10:46:27 +0000 (10:46 +0000)
Introduce machine_kexec_get to allow architecture-specific handling of
the xen region. x86_64 is currently different to x86_32 and ia64.

Signed-off-by: Simon Horman <horms@verge.net.au>
xen/arch/ia64/xen/machine_kexec.c
xen/arch/powerpc/machine_kexec.c
xen/arch/x86/machine_kexec.c
xen/arch/x86/x86_32/Makefile
xen/arch/x86/x86_32/machine_kexec.c [new file with mode: 0644]
xen/arch/x86/x86_64/Makefile
xen/arch/x86/x86_64/machine_kexec.c [new file with mode: 0644]
xen/common/kexec.c
xen/include/xen/kexec.h

index b9c78fd9ed972326b1d822733588ab05711619ec..58590b7c39b6b7608afae88f8be982fc85b84ce4 100644 (file)
@@ -165,6 +165,21 @@ void machine_reboot_kexec(xen_kexec_image_t *image)
        machine_kexec(image);
 }
 
+static int machine_kexec_get_xen(xen_kexec_range_t *range)
+{
+       range->start = virt_to_maddr(_start);
+       range->size = (unsigned long)xenheap_phys_end -
+                     (unsigned long)range->start;
+       return 0;
+}
+
+int machine_kexec_get(xen_kexec_range_t *range)
+{
+       if (range->range != KEXEC_RANGE_MA_XEN)
+               return -EINVAL;
+       return machine_kexec_get_xen(range);
+}
+
 /*
  * Local variables:
  * mode: C
index 51ddd758904ddf0931583d6b0b897b306792b2ea..f16af7108579442c9dda955fb1e46c580a886c74 100644 (file)
@@ -24,6 +24,12 @@ void machine_kexec(xen_kexec_image_t *image)
     printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__);
 }
 
+int machine_kexec_get(xen_kexec_image_t *image)
+{
+    printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__);
+    return -1;
+}
+
 /*
  * Local variables:
  * mode: C
index 5d693a29388c74fbb1276999f2fbeb5ee54738bd..4c2ccd8080b2575354b9f4aa9af49c594f4f7cef 100644 (file)
@@ -24,6 +24,9 @@ typedef void (*relocate_new_kernel_t)(
                 unsigned long *page_list,
                 unsigned long start_address);
 
+extern int machine_kexec_get_xen(xen_kexec_range_t *range);
+
+
 int machine_kexec_load(int type, int slot, xen_kexec_image_t *image)
 {
     unsigned long prev_ma = 0;
@@ -135,6 +138,13 @@ void machine_kexec(xen_kexec_image_t *image)
     }
 }
 
+int machine_kexec_get(xen_kexec_range_t *range)
+{
+       if (range->range != KEXEC_RANGE_MA_XEN)
+               return -EINVAL;
+       return machine_kexec_get_xen(range);
+}
+
 /*
  * Local variables:
  * mode: C
index 0154c366ba727ee9d2bcfdb103325faa59579635..619b1b19590fdf6044f19521662fc504c0c1aacf 100644 (file)
@@ -4,6 +4,7 @@ obj-y += gpr_switch.o
 obj-y += mm.o
 obj-y += seg_fixup.o
 obj-y += traps.o
+obj-y += machine_kexec.o
 
 obj-$(crash_debug) += gdbstub.o
 
diff --git a/xen/arch/x86/x86_32/machine_kexec.c b/xen/arch/x86/x86_32/machine_kexec.c
new file mode 100644 (file)
index 0000000..b22ddbf
--- /dev/null
@@ -0,0 +1,33 @@
+/******************************************************************************
+ * machine_kexec.c
+ *
+ * Xen port written by:
+ * - Simon 'Horms' Horman <horms@verge.net.au>
+ * - Magnus Damm <magnus@valinux.co.jp>
+ */
+
+#ifndef CONFIG_COMPAT
+
+#include <xen/types.h>
+#include <xen/kernel.h>
+#include <asm/page.h>
+#include <public/kexec.h>
+
+int machine_kexec_get_xen(xen_kexec_range_t *range)
+{
+        range->start = virt_to_maddr(_start);
+        range->size = (unsigned long)xenheap_phys_end -
+                      (unsigned long)range->start;
+        return 0;
+}
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index b72197017295b732045d5e612cb7a51d633d1a01..d231427c8ebabe9a1aadb2174e604b6db469b4c7 100644 (file)
@@ -4,6 +4,7 @@ obj-y += entry.o
 obj-y += gpr_switch.o
 obj-y += mm.o
 obj-y += traps.o
+obj-y += machine_kexec.o
 
 obj-$(crash_debug)   += gdbstub.o
 obj-$(CONFIG_COMPAT) += compat.o
diff --git a/xen/arch/x86/x86_64/machine_kexec.c b/xen/arch/x86/x86_64/machine_kexec.c
new file mode 100644 (file)
index 0000000..96413cb
--- /dev/null
@@ -0,0 +1,32 @@
+/******************************************************************************
+ * machine_kexec.c
+ *
+ * Xen port written by:
+ * - Simon 'Horms' Horman <horms@verge.net.au>
+ * - Magnus Damm <magnus@valinux.co.jp>
+ */
+
+#ifndef CONFIG_COMPAT
+
+#include <xen/types.h>
+#include <asm/page.h>
+#include <public/kexec.h>
+
+int machine_kexec_get_xen(xen_kexec_range_t *range)
+{
+        range->start = xenheap_phys_start;
+        range->size = (unsigned long)xenheap_phys_end -
+                      (unsigned long)range->start;
+        return 0;
+}
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
index f1aa784e93803a636befa6482f72c0c36c288a24..fcaebbbebc12650b6b1430085806ec40e6c83ebb 100644 (file)
@@ -20,6 +20,7 @@
 #include <xen/spinlock.h>
 #include <xen/version.h>
 #include <xen/console.h>
+#include <xen/kexec.h>
 #include <public/elfnote.h>
 #include <xsm/xsm.h>
 
@@ -164,17 +165,6 @@ static int kexec_get_reserve(xen_kexec_range_t *range)
     return 0;
 }
 
-static int kexec_get_xen(xen_kexec_range_t *range)
-{
-#ifdef CONFIG_X86_64
-    range->start = xenheap_phys_start;
-#else
-    range->start = virt_to_maddr(_start);
-#endif
-    range->size = (unsigned long)xenheap_phys_end - (unsigned long)range->start;
-    return 0;
-}
-
 static int kexec_get_cpu(xen_kexec_range_t *range)
 {
     int nr = range->nr;
@@ -228,12 +218,12 @@ static int kexec_get_range_internal(xen_kexec_range_t *range)
     case KEXEC_RANGE_MA_CRASH:
         ret = kexec_get_reserve(range);
         break;
-    case KEXEC_RANGE_MA_XEN:
-        ret = kexec_get_xen(range);
-        break;
     case KEXEC_RANGE_MA_CPU:
         ret = kexec_get_cpu(range);
         break;
+    default:
+        ret = machine_kexec_get(range);
+        break;
     }
 
     return ret;
index 1e04f9733c24d9c778db1f71fd15dfe8cdb45615..9dc3dacac007bb19ba033dae7195bd04d0726a49 100644 (file)
@@ -31,6 +31,7 @@ void kexec_disable_iosapic(void);
 void kexec_crash_save_cpu(void);
 crash_xen_info_t *kexec_crash_save_info(void);
 void machine_crash_shutdown(void);
+int machine_kexec_get(xen_kexec_range_t *range);
 
 #endif /* __XEN_KEXEC_H__ */